"""
@Author  : 康帅
@Time    : 2021/5/21 17:58
@Function: 
"""
import socketio

sio = socketio.Server()


# 定义事件处理
@sio.event
def my_event(sid, data):
    pass


@sio.on('my event')
def another_event(sid, data):
    pass


# connect和disconnect事件是特殊的
# 当客户端连接或断开与服务器的连接时，它们会自动被调用
@sio.event
def connect(sid, environ, auth):
    """
    :param sid: 唯一的会话标识
    :param environ: 包含请求的信息，包括HTTP标头标准WSGI格式的字典
    :param auth: 包含客户端传递的任何身份验证详细信息，或者None客户端未传递任何内容
    :return:
    """
    print("connect", sid)
    # 有时将数据传回被拒绝的客户端很有用。在这种情况下，
    # False socketio.exceptions.ConnectionRefusedError可以引发而不是返回，
    # 并且其所有参数将与拒绝消息一起发送给客户端
    raise ConnectionRefusedError('authentication failed')


@sio.event(namespace='/chat')
def my_custom_event(sid, data):
    pass


@sio.on('my custom event', namespace='/chat')
def my_custom_event(sid, data):
    pass


@sio.event
def disconnect(sid):
    print("disconnect", sid)


# 发出事件
sio.emit('my event', {'data': 'foobar'})
# 有时服务器可能只想向特定客户端发送事件。这可以通过room在发出调用中添加一个参数来实现
user_sid = 123456
sio.emit('my event', {'data': 'foobar'}, room=user_sid)


class MyCustomNamespace(socketio.Namespace):
    """ 基于类的命名空间 """

    def on_connect(self, sid, environ):
        pass

    def on_disconnect(self, sid):
        pass

    def on_my_event(self, sid, data):
        self.emit('my_response', data)


sio.register_namespace(MyCustomNamespace('/test'))
